module util{
    export class LoadGroupUtil{
        private static _ins:LoadGroupUtil;
        private _loadingUI:Component.LoadingUI;
		private _host:ILoadInterface;
        private _groupName:string;
		private _callback:Function;

        public static getInstance(loadingUi:Component.LoadingUI=null):LoadGroupUtil{
            if(LoadGroupUtil._ins==null){
                LoadGroupUtil._ins =new LoadGroupUtil();
                LoadGroupUtil._ins._loadingUI=loadingUi;
            }
            return LoadGroupUtil._ins;
        }

		/**
		 * 预加载资源组
		 */
		public preLoadGroup(host:util.ILoadInterface,configName:string="resource/default.res.json",groupName:string="preload",root:string="resource/"):void{
            this._host=host;
			//先加载配置文件
            if (RES.ResourceConfig.length == 0) {
                RES.addEventListener(RES.ResourceEvent.CONFIG_COMPLETE, this.onConfigComplete, this);
                RES.addEventListener(RES.ResourceEvent.CONFIG_LOAD_ERROR, this.onConfigError, this);
                RES.loadConfig(configName, root);
                this._groupName = groupName;
            }			
		}

		/**
		 * 资源配置文件加载完成
		 */
		private onConfigComplete(evt:RES.ResourceEvent):void{
			if(this._loadingUI){
				this._loadingUI.setTipText("配置文件加载完成!");
				this._loadingUI.setTipText("加载资源组中···");
			}else{
				egret.log("配置文件加载完成!");
				egret.log("加载资源组中···");
			}			
			//移除加载配置文件监听器
			RES.removeEventListener(RES.ResourceEvent.CONFIG_COMPLETE,this.onConfigComplete,this);
			RES.removeEventListener(RES.ResourceEvent.CONFIG_LOAD_ERROR,this.onConfigError,this);
			//开始加载资源组
			RES.addEventListener(RES.ResourceEvent.GROUP_COMPLETE,this.onGroupComplete,this);
			RES.addEventListener(RES.ResourceEvent.GROUP_LOAD_ERROR,this.onGroupError,this);
			RES.addEventListener(RES.ResourceEvent.GROUP_PROGRESS,this.onGroupProgress,this);
			RES.addEventListener(RES.ResourceEvent.ITEM_LOAD_ERROR,this.onItemError,this);
			RES.loadGroup(this._groupName);
		}

		/**
		 * 资源配置文件加载错误
		 */
		private onConfigError(evt:RES.ResourceEvent):void{
			if(this._loadingUI){
				this._loadingUI.setTipText("配置文件加载错误！");
			}else{
				egret.error("配置文件加载错误！");
			}		
		}

		/**
		 * 预加载资源组中
		 */
		private onGroupProgress(evt:RES.ResourceEvent):void{
			if(evt.groupName==this._groupName && evt.resItem.loaded){
				if(this._loadingUI){
					this._loadingUI.setProgress(evt.itemsLoaded,evt.itemsTotal);
				}else{
					egret.log(evt.itemsLoaded,evt.itemsTotal);
				}				
			}			
		}

		/**
		 * 预加载资源组完成
		 */
		private onGroupComplete(evt:RES.ResourceEvent):void{
			if (this._loadingUI) {
				this._loadingUI.setTipText("资源组加载完成！");
			} else {
				egret.log("资源组加载完成！");
			}
			RES.removeEventListener(RES.ResourceEvent.GROUP_COMPLETE,this.onGroupComplete,this);
			RES.removeEventListener(RES.ResourceEvent.GROUP_LOAD_ERROR,this.onGroupError,this);
			RES.removeEventListener(RES.ResourceEvent.GROUP_PROGRESS,this.onGroupProgress,this);
            RES.removeEventListener(RES.ResourceEvent.ITEM_LOAD_ERROR,this.onItemError,this);
			if(this._host){
				try{
					this._host.loadGroupCallback();
				}catch(e){
					this._loadingUI.setTipText(e);
				}
			}
		}

		/**
		 * 预加载资源组失败
		 */
		private onGroupError(evt:RES.ResourceEvent):void{
			if (this._loadingUI) {
				this._loadingUI.setTipText("预加载资源组失败！");
			} else {
				egret.error("预加载资源组失败！");
			}
			RES.removeEventListener(RES.ResourceEvent.GROUP_COMPLETE,this.onGroupComplete,this);
			RES.removeEventListener(RES.ResourceEvent.GROUP_LOAD_ERROR,this.onGroupError,this);
			RES.removeEventListener(RES.ResourceEvent.GROUP_PROGRESS,this.onGroupProgress,this);
            RES.removeEventListener(RES.ResourceEvent.ITEM_LOAD_ERROR,this.onItemError,this);
		}

		/**
		 * 预加载资源失败
		 */
		private onItemError(evt:RES.ResourceEvent):void{
			if (this._loadingUI) {
				this._loadingUI.setTipText("资源："+evt.resItem.url+"加载错误！");
			} else {
				egret.error("资源："+evt.resItem.url+"加载错误！");
			}
		}
    }
}